package com.vhall.component.dao.data;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vhall.component.entity.account.AccountEntity;
import com.vhall.component.entity.data.dto.ViewingRecordsDTO;
import com.vhall.component.entity.data.vo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 用户表mapper类
 *
 * @author kainan.li
 * @date 2021-04-06 19:01:15
 */
@Mapper
@Repository
public interface AccountForDataMapper extends BaseMapper<AccountEntity> {

    /**
     * 获得基础值(全量数据)
     *
     * @param reqVO 参数
     * @return 返回值
     */
    UserBasicStatisticsRspVO getBasicStatisticsInfo(UserParamVO reqVO);

    /**
     * 获取观看pv值
     *
     * @param reqVO 参数
     * @return 返回值
     */
    List<UserWatchPvRspVO> getUserWatchPvInfo(UserParamVO reqVO);

    /**
     * 获取观看最大pv值
     *
     * @param reqVO 参数
     * @return 返回值
     */
    Integer getUserMaxPv(UserParamVO reqVO);

    /**
     * 获取观看最大pv值
     *
     * @param reqVO 参数
     * @return 返回值
     */
    BigDecimal getUserLiveFlow(UserParamVO reqVO);

    /**
     * 获取观看音视频流
     *
     * @param reqVO 参数
     * @return 返回值
     */
    BigDecimal getUserVodFlow(UserParamVO reqVO);

    /**
     * 获取用户的音试频
     *
     * @param reqVO 参数
     * @return 返回值
     */
    BigDecimal getUserVodStorage(UserParamVO reqVO);

    /**
     * 获取直播时间
     *
     * @param reqVO 参数
     * @return 返回值
     */
    Integer liveDuration(UserParamVO reqVO);

    /**
     * 从record表中获取直播时间【由于原方法存在缺陷：当主持人不参会时 直播时长 无法统计】
     *
     * @param reqVO 参数
     * @return 返回值
     */
    Integer liveDurationFromRecord(UserParamVO reqVO);

    /**
     * getVodBasicStatisticsInfo
     *
     * @param reqVO 参数
     * @return 返回值
     */
    UserBasicStatisticsRspVO getVodBasicStatisticsInfo(UserParamVO reqVO);

    /**
     * 获得音视频总时间
     *
     * @param reqVO 参数
     * @return 返回值
     */
    Integer getVodTotalTime(UserParamVO reqVO);

    /**
     * getLiveUserWatchUvInfo
     *
     * @param reqVO 参数
     * @return 返回值
     */
    List<UserLiveWatchUvRspVO> getLiveUserWatchUvInfo(UserParamVO reqVO);

    /**
     * getVodUserWatchUvInfo
     *
     * @param reqVO 参数
     * @return 返回值
     */
    List<UserLiveWatchUvRspVO> getVodUserWatchUvInfo(UserParamVO reqVO);

    /**
     * getVodUserWatchUvInfo
     *
     * @param reqVO 参数
     * @return 返回值
     */
    List<UserLiveWatchUvRspVO> getInavUserWatchUvInfo(UserParamVO reqVO);

    /**
     * getLiveDeviceInfo
     *
     * @param reqVO 参数
     * @return 返回值
     */
    List<UserDeviceRspVO> getLiveDeviceInfo(UserParamVO reqVO);

    /**
     * getVodDeviceInfo
     *
     * @param reqVO 参数
     * @return 返回值
     */
    List<UserDeviceRspVO> getVodDeviceInfo(UserParamVO reqVO);

    /**
     * 获取城市维度下的直播观看数据
     *
     * @param reqVO 参数
     * @return 返回值
     */
    List<UserProvinceRspVO> getLiveProvinceInfoByCountry(UserParamVO reqVO);

    /**
     * 获取省维度下的直播观看数据
     *
     * @param reqVO
     * @return
     */
    List<UserProvinceRspVO> getLiveProvinceInfoByProvince(UserParamVO reqVO);

    /**
     * 获取城市维度下的回放观看数据
     *
     * @param reqVO 参数
     * @return 返回值
     */
    List<UserProvinceRspVO> getVodProvinceInfoByCountry(UserParamVO reqVO);

    /**
     * 获取省维度下的回放观看数据
     *
     * @param reqVO
     * @return
     */
    List<UserProvinceRspVO> getVodProvinceInfoByProvince(UserParamVO reqVO);

    List<PlayVolumeTrendRspVO> getVodInfoByDay(UserParamVO reqVO);

    /**
     * 获取全部数据的设备分布数据
     *
     * @param reqVO
     * @return
     */
    List<UserDeviceRspVO> getLiveAndVodDeviceInfo(UserParamVO reqVO);

    /**
     * 根据指定终端查询数据
     */
    Integer getStatisticsInfoByTerminals(UserParamVO reqVO);

    /**
     * 直播中
     */
    List<DpWatchTimeTopRspVO> getLiveStreamDpWatchTimeTop(UserParamVO reqVO);

    /**
     * 直播回放
     */
    List<DpWatchTimeTopRspVO> getLiveBackDpWatchTimeTop(UserParamVO reqVO);

    /**
     * 根据account_id 查询当前人员的直播观看记录+回放观看记录，两个记录取对应房间的最后观看时间，然后再去重排序
     */
    IPage<ViewingRecordsDTO> viewingRecords(@Param("page") Page<ViewingRecordsDTO> page, @Param("account_id") Integer accountId);

    IPage<ViewingRecordsDTO> viewingRecordsNew(@Param("page") Page<ViewingRecordsDTO> page, @Param("account_id") Integer accountId);

    /**
     * 获得基础值(根据部门进行数据划分)
     * @param userParamVO
     * @return
     */
    UserBasicStatisticsRspVO getBasicStatisticsOrgInfo(UserParamVO userParamVO);
    /**
     * 获取观看最大pv值
     *
     * @param reqVO 参数
     * @return 返回值
     */
    Integer getNumberOfReservation(UserParamVO reqVO);

    /**
     * 统计预告页访问人数(直播预告在直播前被访问的 uv 数量)
     * @param reqVO
     * @return
     */
    Integer getUvPreviewPage(UserParamVO reqVO);

    /**
     * 统计直播间观看人数
     * @param startTime
     * @param endTime
     * @return
     */
    Integer selectWatchUVCount(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
}
